{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "http://cs229.stanford.edu/ps/ps2/ps2.pdf"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# (a)\n",
    "\n",
    "The most notable difference is that training of data_b doesn't seem to converge, but that of data_a does."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# (b)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "def add_intercept(X_):\n",
    "    m, n = X_.shape\n",
    "    X = np.zeros((m, n + 1))\n",
    "    X[:, 0] = 1\n",
    "    X[:, 1:] = X_\n",
    "    return X\n",
    "\n",
    "def load_data(filename):\n",
    "    D = np.loadtxt(filename)\n",
    "    Y = D[:, 0]\n",
    "    X = D[:, 1:]\n",
    "    return add_intercept(X), Y\n",
    "\n",
    "def calc_grad(X, Y, theta):\n",
    "    m, n = X.shape\n",
    "    grad = np.zeros(theta.shape)\n",
    "\n",
    "    margins = Y * X.dot(theta)\n",
    "    probs = 1. / (1 + np.exp(margins))\n",
    "    grad = -(1./m) * (X.T.dot(probs * Y))\n",
    "\n",
    "    return grad\n",
    "\n",
    "\n",
    "def logloss(X, Y, theta):\n",
    "    Y_copy = Y.copy()\n",
    "    Y_copy[Y_copy == -1] = 0\n",
    "    pred_probs = 1 / (1 + np.exp(- X.dot(theta)))\n",
    "    epsilon = 1e-16\n",
    "    return - np.sum(Y_copy * np.log(pred_probs + epsilon) + (1 - Y_copy) * np.log(1 - pred_probs + epsilon))\n",
    "    \n",
    "\n",
    "def logistic_regression(X, Y):\n",
    "    m, n = X.shape\n",
    "    theta = np.zeros(n)\n",
    "    learning_rate = 10\n",
    "\n",
    "    i = 0\n",
    "    thetas = []\n",
    "    errors = []\n",
    "    while True:\n",
    "        i += 1\n",
    "        prev_theta = theta\n",
    "        grad = calc_grad(X, Y, theta)\n",
    "        theta = theta  - learning_rate * (grad)\n",
    "        if i % 10000 == 0:\n",
    "            print('Finished {0} iterations; logloss: {1}'.format(i, logloss(X, Y, theta)))\n",
    "            thetas.append(theta)\n",
    "        error = np.linalg.norm(prev_theta - theta)\n",
    "        errors.append(error)\n",
    "        if error < 1e-15:\n",
    "            print('Converged in %d iterations' % i)\n",
    "            break\n",
    "        if i == 5 * 10000:\n",
    "            break\n",
    "    return thetas, errors"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import pandas as pd\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "%matplotlib inline"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "dfa = pd.read_csv('http://cs229.stanford.edu/ps/ps2/data_a.txt', header=None, sep=' ', names=['label', 'x1', 'x2'])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.axes._subplots.AxesSubplot at 0x10edbf518>"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYUAAAEKCAYAAAD9xUlFAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAG5tJREFUeJzt3X2sZVV5x/Hv47wwo8MIcY7GDi+XGnyZtqJwB6y1LSqE\ngf4xNTEtoxGL0wxTxRr+MOAYtK2F1tQWY0SBMIRo20tQqY5GpdVGaUKp96K8DQR7y+sgCRe1U14E\nZsLTP/a5Z849c865+5yz195r7f37JGS4557MrH1e1rPWs561trk7IiIiAC+pugEiIhIPBQUREelQ\nUBARkQ4FBRER6VBQEBGRDgUFERHpUFAQEZEOBQUREelQUBARkY6VVTdgVBs2bPCpqamqmyEikpTb\nb7/9SXdvLfe85ILC1NQUc3NzVTdDRCQpZvZwnucpfSQiIh0KCiIi0qGgICIiHcGCgpldZ2ZPmNk9\nA35vZvY5M5s3s7vM7ORQbRERkXxCzhSuB7YM+f3ZwInt/3YAXwzYFhERySFYUHD3W4BfDHnKVuBL\nnrkNOMrMXh2qPSIisrwq1xQ2Ao92/byv/dhhzGyHmc2Z2dzCwkIpjRMRaaIkFprd/Rp3n3b36VZr\n2b0Xwy0swOxs9qeISB9N7iaqDAqPAcd2/XxM+7FwZmbg+OPhzDOzP2dmgv5zIpKepncTVQaFPcB5\n7SqktwD73f3xYP/awgJs3w6/+hXs35/9uX17M4cCItKXuomAx1yY2QxwOrDBzPYBnwRWAbj7VcC3\ngXOAeeBZ4PxQbQHgoYdg9ersXV60alX2+KQpKRGphYcegpU9vWLTuolgQcHdty3zewc+FOrfP8zU\nFLzwwtLHDhzIHhcRAX78Y3jqqaWPNa2bSGKhuRCtVjYP7LZ9e3PCv4gMtbAAF110+ONXXNGsbqI5\nQWFhAXbvXvrY7t2dZGGTqw1E5FCGuduRR8LJDTtroTlBod873k4Whqo2UKARSUe/DPPBg81KHUGT\ngsKANYUn100FqTZoelmbSGparSx5sHYtrF+f/bl7d7NSR9CkoDDgHX/w6dagCcTYYi5r0+xFZLBt\n2+Dhh+F738v+3Da0XKaekrvz2kS2bYMzzsh6/KkpaLWYWii+KCnW6teZmSw4rV6dXfPu3c380IsM\n02o1b3bQrTkzhUWtFmze3HnXQ0wZY6x+jXn2IvWjGWm6mhcU+ih6yhhjbnLIOrvIUKN28FpPS5tl\ne8jSMT097XNzc1U3I5eFhSWZqsrbcvzxS1Naa9dmQbDqtnWL6TWT0VOOqXzOmsjMbnf36eWep5lC\nQD2ZqsrbEtvspZdGmHEZJ+WoGWn6FBQaJObKCq15xGecDj7G9TQZjYJCw8Q0e+mmEWZ8xungU5iR\nynAKChIFjTDjM24HH/OMVJbXrH0KEq3FDmj79myGcOCARpgx6LO1J5em1/r3M2oRRVVFF5opSDQ0\nwoxTrCnHlIxaRFFl0YVKUkVEAhq1TDdUWa9KUkUmpF25ksdyn5NRiyiqLrpQUBDpQ3smJI88n5NR\niyiqLrpQUBDpoT0Tkkfez8moVVxVl/Wq+kikR6yn3EpcRvmcjFrFNW7VVxEUFER6VD19lzSM+jkZ\ntUy3qrJepY8aRouny6t6+i5pqOvnRCWpDaKb7IxGJ7ZKHql8TvKWpCooNISONBZpNu1TkCWqrn0W\nkTQoKDSEFk9FJA8FhZgVuCpc10WxUWmhXWQ4BYVYBdhS2/QD57RLWWR5WmiOkVaFC6eXVJpOC80p\n06pw4fSSpkVpvuooKMRIq8KF00uaDqX5qhU0KJjZFjO738zmzeySPr9/uZl908zuNLO9ZnZ+yPYk\nQ6vChRv3JdWItVw6jLB6wYKCma0ArgTOBjYB28xsU8/TPgTc6+4nAacDf29mPZP8hmr6qnAAo76k\nGrGWT2m+w5U9MAk5UzgVmHf3B9z9BeAGYGvPcxw40swMWAf8AjgYsE1p0X0QC5f3JdWItRpK8y1V\nxcAkZFDYCDza9fO+9mPdPg+8AfgZcDfwEXd/MWCbpGB1Ta9oxFoNZU4PqWpgUvVC81nAHcCvAW8C\nPm9m63ufZGY7zGzOzOYW6tb7lCVA713n9IpGrNVR5jRT1cAkZFB4DDi26+dj2o91Ox+4yTPzwIPA\n63v/Ine/xt2n3X261cQhw6QC9N51T69oxFotZU6rG5iEDAqzwIlmdkJ78fhcYE/Pcx4B3glgZq8C\nXgc8ELBNaZpklB+o925CekUj1nLVNRU5rqoGJsGCgrsfBC4EbgbuA250971mttPMdraf9ingrWZ2\nN/B94GJ3fzJUm5I06Sg/UO/dlPSKRqzlqHMqchJVDEx0zEXMijibIeD5Dos37Vm1KgsIummPjENH\nkJRDx1zUQRGj/IBzUKVXpAh1SEXWKfW1suoGyBBF5Wi2bYMzzghyz8Cqbi4u9ZF6KrJut7nVTCFm\nRY7ylRyXSKVc6TVqHUcKMwrNFGIXcJQvEos8H/OFhfi+Boupr+71kMXUV28bU5lRaKFZRKIXa4ea\nd5E8hsV0LTRLelKYW0vpYt4omTf1ldJiuoLCIOqgyqVCdRkg9g41TxVeSovpCgr9qIMqV8xDQalc\nCh3qcnUcKS2mKyj0UgdVvtiHglKplDrUYVLZ16Pqo16jlBNIMVIYCspEJq0cqksRXgr7ejRT6JVC\nB1W39Y66DAVLkOJbX1Q2toitNim+fmVTUOgVewdV1/WOVObWFUrxrY8pG5vi6wflBzLtUxikip0y\ny/2bMRQ7SyXyvPUxbu6anc064f37Dz22fn0W+zdvLq8dqX51ityfoX0Kkyr7WIg8wxgtyDbWcm99\nrKPgWLKxKX51mno7ToH8734s3zAp3bC3PqYUTa9YsrEpfnXqeDtOySvvux/LN0xKz/MOe+tjHwXH\nsFyU4lenqkCmNYUYjJrwjDF53CBVnsPT761PNV9ehdS+OkXeyCrvmoKCQiyKvo1Zap/+RMTaAesu\nePVV1Fc5b1DQ5rVYFLk7J9YjJYtUUdCLdW9jXTZ3yeHK3vCmNYWYFLU7J8CqY1SbfiostYl5wVL3\nUZIiKCjUTYBVx6jKHSsutUlxwXIcUQ0CpFQKCnVT8FA2unLHCEptYqimCSmqQYCUTkGhbgoeyu77\nyQKnvWSWDRyKApWWO0aSv6lrqia6QYCUTkGhjooays7M8KY/PJ6vP3MmD3M8f0w2ZKw0h96U/E3J\nFtNFP/lJ5ROx6NU9taaSVOmvT+3ls6zl9Wse5tPXtcKlTPJWFanktjC9xWoHD2aBf1EMJbexSLmw\nT2cfyWT65O5Xv2wVd37joXBfglGS2XXN35SsX7rIDNas0USsV1NSa9qnIP31yd2vfPEAR795Ksy/\n1/2NW5ydbN+eFd+rRwqm376LNWvgK1+Bo4/WRKxbrHtUiqaZgvRXdu4+gqqiJhq0bv/mN082Eatj\n3j2SGofgFBRksDJrL5vyjYtMiNhf15LWptQ4aKFZ4qEDfCpT1Lp9rGdDFSnVGgedfSTp0QE+lSnq\nfJ0m5N3LPouobAoKEpe6f+NqTlnA9AVdUzCzLWZ2v5nNm9klA55zupndYWZ7zeyHIdsjImE1Je9e\nZ8FmCma2ArgSOBPYB8ya2R53v7frOUcBXwC2uPsjZvbKUO0RkXLEkAVczPuvWwdPP61s5ChCpo9O\nBebd/QEAM7sB2Arc2/Wc9wA3ufsjAO7+RMD2NFeqK2OSrCqzgIv1CpCtbaxdm/2/6hbyCZk+2gg8\n2vXzvvZj3V4LHG1mPzCz283svH5/kZntMLM5M5tbSL3wuewC7rrWB4r00W8P5OL/13H3cQhV71NY\nCZwC/AFwFnCpmb2290nufo27T7v7dCvlkW7ZHXS/ffkf+IC+GVJb/fZALtJeyHxCBoXHgGO7fj6m\n/Vi3fcDN7v6Muz8J3AKcFLBN1ani4JR+35DnnoOrrw73b4pUqF/10yJVQeUTMijMAiea2Qlmtho4\nF9jT85xvAG8zs5Vm9lLgNOC+gG2qThXHOExNwfPPH/745ZdrtiC11F39tLiWsGaNqqBGEWyh2d0P\nmtmFwM3ACuA6d99rZjvbv7/K3e8zs+8CdwEvAte6+z2h2lSpKgq4Wy34+Mfh0kuXPl633UQiXbqr\nn1R9NDodc1GmKo5xaMK5AyKyLN1PIUZV3NxXu4miV8cTRSVdOuaibFUUcMewm0j6SvlOXlJPSh+J\nVESZPSmT0kcyudTyGom1V/cVkhgpKEh/qe2ETq296ETRWCU2tiicgoIcLrU7lKfW3jbVAMQnwbFF\n4RQU5HCp5TVSa2+XKgrSpL9ExxaFU/WRHC61vEZq7e2h+wrF4eqrly76QzP3eWqmIIdLLa+RWnsl\nOgsLcNllhz+e0NiiMJopSH+p7W1Irb0SlYcegiOOyM6L7LZrV/M+SgoKMlhqeY3U2ivR6JeBXLMG\nLrigkuZUamj6yMzWm9lr+jz+xnBNEhEpV78M5HXXNXOMMXCmYGZ/BHwWeMLMVgF/4u6z7V9fD5wc\nvnkiIuVQBjIzLH20CzjF3R83s1OBL5vZx9z9XwArp3kiIuVRBnJ4UFjh7o8DuPuPzOztwLfM7Fgg\nrQOTRKRxFhY06h/HsDWFp7rXE9oB4nRgK/AbgdslIjI27Uwe37Cg8GfAS8xs0+ID7v4UsAX409AN\nExEZh3YmT2ZgUHD3O939v4Ebzexiy6wF/gH4YGktFBlF008zk5RPPYlCnh3NpwHHArcCs8DPgN8J\n2ajkqCOKg3IGQvKnnlQuT1A4APwKWAusAR509xeDtiolVXdECkgZ5QykTaeeTCZPUJglCwqbgd8F\ntpnZV4K2KhVVd0RVB6SYKGfQCHnHQDp9dnx5gsJ2d/+Eux9w98fdfSuwJ3TDklBlRzRJQKrj7EI5\ng9obdQzUasHmzZohjGrZoODuh90Q2d2/HKY5iamyIxo3INV1dqGcQa1VPSlvEh2dPYlBHRGEH4mP\nE5Dq8M0aNstRzqC2lB0sj4LCpHo7IihnJD7OyDj1b1aeWY5yBrWk7GB5zD2tEyump6d9bu6wjFYc\nFhayzqr79k1r12bBIlQnNcpe/iraV5SU2y6FmJnJJrarVmUBYfduTQZHYWa3u/v0cs/TTKFIVYzE\nRxkZp5x3T32WIxNTdrAcuslOkVKY46Z6PnAKr60Ep1NMw9NMoUipjMRTzLun8tqKJE5rCiHozN5w\n9NqKjCXvmoLSRyFojhuOXttyKPg2VtD0kZltMbP7zWzezC4Z8rzNZnbQzN4dsj0ikkNdNzhKLsGC\ngpmtAK4EzgY2kZ2ZtGnA8z4N/GuotohITglucKzjqS1VCjlTOBWYd/cH3P0F4Aayu7b1+jDwNeCJ\ngG0RkTwSK/3VpKZ4IYPCRuDRrp/3tR/rMLONwLuALwZsh0g4dRumJlT6m+CkJglVl6R+Frh4ufsz\nmNkOM5szs7kFveMSizoOUxMq/U1sUpOMYCWpZvbbwF+4+1ntnz8G4O5/0/WcBwFr/7gBeBbY4e5f\nH/T3JlGSGjtVlkyu7sduJPAZqftbULQYjrmYBU40sxPMbDVwLj33YXD3E9x9yt2ngK8CHxwWEGqv\njFREHUe3Vaj7MDWBDY4JTWqSEiwouPtB4ELgZuA+4EZ332tmO81sZ6h/N1lldNZKwhYnodx7nek8\npOJpR3MMypoHz85mQWf//kOPrV+ffaM2by7u32kKHdspCdGO5pQspiK6g8JiKqLIoKDRbbFSPVxQ\nZIiqq48EyuuslYQtXgK5d5FRKCjEoMzOuowkbN1q90UaROmjWJSZigh5qNxinn316mz2s3u3Uiwi\nCVFQiEnqJ4B2Vzctro+8//2wcuXSIKHFWJFoKX0kxelXu3/ggEpgRRKioCDF6bdg3qtOG7xEakhB\nQYrTu2C+Zk3/mYNKYKunYgAZQEFBitVd3fTII3D99SqBjY2OOpEhtKN5kAQOBEuGXsvRhHy9dIpc\nY8VwIF66NJIqljZ45Rf6s1f3g/xkYpop9NJIanka+YdRxmdPn+/G0kxhXBpJDadZVDhlfPYm2D2v\ntelmUFDopUPjBtPR22GV9dkb46gTjQWaQ0Ghlw6NG0yzqLDK/OyNsM6jsUCz6JiLfnQkcn+aRYUX\n4WevrJPdJQ4KCoOkfg5RCIsj2d4by+h1KlZknz2NBZpF6SMZje5/WLzIV3CVUW0WzRRkdJGNZJPW\n76jxCANthFktCUT7FESqoj0DUiLtUxCJnaq5JEIKCiJV0QquREhBQaQqWsGVCGmhWaRKWsGVyCgo\niFSthtVcOjMxXUofiUihdE5S2hQURKQwOicpfQoKIlIYVdmmT0FBRAqjKtv0KSjIeCI/r0eqoSrb\n9CkoyOi0kihD6MzEtOnsIxmNzusRSVIUZx+Z2RYzu9/M5s3skj6/f6+Z3WVmd5vZrWZ2Usj2SAG0\nkihSa8GCgpmtAK4EzgY2AdvMbFPP0x4Eft/dfwv4FHBNqPZIQbSSKFJrIWcKpwLz7v6Au78A3ABs\n7X6Cu9/q7r9s/3gbcEzA9kgRtJIoUmshj7nYCDza9fM+4LQhz98OfCdge9KQwvkAOq9HpLaiqD4y\ns7eTBYWLB/x+h5nNmdncQp1LIFOq6mm1YPNmBQSJnqqnRxMyKDwGHNv18zHtx5YwszcC1wJb3f3n\n/f4id7/G3afdfbpV105I5wOIFC6lcVYsQgaFWeBEMzvBzFYD5wJ7up9gZscBNwHvc/efBmxL/FTV\nI3lp6JtL6HFWXd+GYEHB3Q8CFwI3A/cBN7r7XjPbaWY720/7BPAK4AtmdoeZNXcDgqp6JI+mDX0n\n6HlDjrPq/DZo81pMZmayocyqVVlA2L1b20HlkGEbB6F+C/+L34fVq7MB04jfh1D7LFPdvxnF5jUZ\nkc4HkGEGDX2vvrp+w9YCcj+tFlxxBRxxBBx5ZHHV03XP9CooxEZVPTLIoBTjZZfVr0ChgJ53ZgYu\nuujQROOKK4oZZ9U906ugIJKKfhsHd+3KhsLd6jBsnbDn7Z5oPPUUPP98FiCKiJV137+poCBSliLK\nVXpTjBdcMF7nGXvpzIQ9b+gUT50zvQoKImUoslylO8U4TueZSunMBD1vGSmeumZ6VX0kEloZ5Sp5\nj0dJtXRmDCrmWypv9VHIs49EBA7lMro74sVcRlEd8eKsIYa25BX4nC8d0TUepY9EQoupXCWWtpSU\nwqpriickBQWR0GIqV4mhLTrnK2pKH6UihSO1ZbCYchlVtyWmFJYcRkEhBRNu95dI5M37l6HKtsSS\nwpK+lD6KnabaUjcxpLBkIM0UYqepdjmUnitX1SksGUgzhdhpqh1eKpu56kalQVFSUIidptphKT0n\nsoTSRynonmqvWwdPP511WgoMk1N6TmQJzRRS0WrB/DyccorSHEVSek5kCQWFVCjNEUbe9Fzsp4qK\nFERBIRV1v91TlZY7jVML0dIgCgqpUJojrEGVMHlnaJpJSE0oKKRCVUjVyDND00xCakT3U0iNNlmV\na7n7DzTo/gSStrz3U2j2TCHFKb82/JRruRma1nqkZpobFDTll7yGLURrrWd8KQ7KGqCZQUHlnTKq\nYTO0Xbu01jMqDcqi1cygoCm/FGGxY/vMZ8AdPvrRkW8w30galEWtmUFBU/56qDL90NuxPfccXH55\n+e2o0rivvwZlUWtmUFB5Z/qqTj80vWOb5PXXoCxqzS5JVXnnZKp6/WIoA42hDVUp4toX7ya4alUW\nEHQ3weBUkpqHyjvHV+VIPYZRepNnm0W8/ssdLSKVafZMQcZT9Si56n+/ty1Nm23G9PpLblHMFMxs\ni5ndb2bzZnZJn9+bmX2u/fu7zOzkkO2RglQ9Uo9plN7E2WZMr78ULthNdsxsBXAlcCawD5g1sz3u\nfm/X084GTmz/dxrwxfafErMYFgp1j99q6fWvrZAzhVOBeXd/wN1fAG4AtvY8ZyvwJc/cBhxlZq8O\n2CYpQiwjxSaO0mOi17+WQt6OcyPwaNfP+zh8FtDvORuBxwO2S4qgkaJILSVxj2Yz2wHsADjuuOMq\nbo10tFoKBiI1EzJ99BhwbNfPx7QfG/U5uPs17j7t7tMtdUIiIsGEDAqzwIlmdoKZrQbOBfb0PGcP\ncF67CuktwH53V+pIRKQiwdJH7n7QzC4EbgZWANe5+14z29n+/VXAt4FzgHngWeD8UO0REZHlBV1T\ncPdvk3X83Y9d1fX/DnwoZBtERCS/Zh9zISIiSygoiIhIR3JnH5nZAvDwBH/FBuDJgpqTgqZdL+ia\nm0LXPJrj3X3Z8s3kgsKkzGwuz6FQddG06wVdc1PomsNQ+khERDoUFEREpKOJQeGaqhtQsqZdL+ia\nm0LXHEDj1hRERGSwJs4URERkgFoGhSbe8S3HNb+3fa13m9mtZnZSFe0s0nLX3PW8zWZ20MzeXWb7\nQshzzWZ2upndYWZ7zeyHZbexaDk+2y83s2+a2Z3ta076uBwzu87MnjCzewb8Pmz/5e61+o/snKX/\nAX4dWA3cCWzqec45wHcAA94C/FfV7S7hmt8KHN3+/7ObcM1dz/t3suNW3l11u0t4n48C7gWOa//8\nyqrbXcI17wI+3f7/FvALYHXVbZ/gmn8POBm4Z8Dvg/ZfdZwpNPGOb8tes7vf6u6/bP94G9kx5SnL\n8z4DfBj4GvBEmY0LJM81vwe4yd0fAXD31K87zzU7cKSZGbCOLCgcLLeZxXH3W8iuYZCg/Vcdg8Kg\nu7mN+pyUjHo928lGGilb9prNbCPwLrJ7f9dBnvf5tcDRZvYDM7vdzM4rrXVh5LnmzwNvAH4G3A18\nxN1fLKd5lQjafyVx5zUpjpm9nSwovK3qtpTgs8DF7v5iNohshJXAKcA7gbXAf5rZbe7+02qbFdRZ\nwB3AO4DXAP9mZv/h7v9XbbPSVMegUNgd3xKS63rM7I3AtcDZ7v7zktoWSp5rngZuaAeEDcA5ZnbQ\n3b9eThMLl+ea9wE/d/dngGfM7BbgJCDVoJDnms8H/tazhPu8mT0IvB74UTlNLF3Q/quO6aMm3vFt\n2Ws2s+OAm4D31WTUuOw1u/sJ7j7l7lPAV4EPJhwQIN9n+xvA28xspZm9FDgNuK/kdhYpzzU/QjYz\nwsxeBbwOeKDUVpYraP9Vu5mCN/CObzmv+RPAK4AvtEfOBz3hw8RyXnOt5Llmd7/PzL4L3AW8CFzr\n7n1LG1OQ833+FHC9md1NVpFzsbsne3qqmc0ApwMbzGwf8ElgFZTTf2lHs4iIdNQxfSQiImNSUBAR\nkQ4FBRER6VBQEBGRDgUFERHpUFAQKZCZfdfM/tfMvlV1W0TGoaAgUqy/A95XdSNExqWgIDKG9j0a\n7jKzNWb2svY5/r/p7t8Hnqq6fSLjqt2OZpEyuPusme0B/prs4Ll/THnnsMgiBQWR8f0V2dk8zwF/\nXnFbRAqh9JHI+F5BdlOXI4E1FbdFpBAKCiLjuxq4FPgn4NMVt0WkEEofiYyhfUezA+7+z2a2ArjV\nzN4B/CXZWf7r2idcbnf3m6tsq8godEqqiIh0KH0kIiIdCgoiItKhoCAiIh0KCiIi0qGgICIiHQoK\nIiLSoaAgIiIdCgoiItLx/12uPmJgMaS1AAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x10eda2b00>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "ax = plt.axes()\n",
    "\n",
    "dfa.query('label ==  1').plot.scatter(x='x1', y='x2', ax=ax, color='blue')\n",
    "dfa.query('label == -1').plot.scatter(x='x1', y='x2', ax=ax, color='red')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "dfb = pd.read_csv('http://cs229.stanford.edu/ps/ps2/data_b.txt', header=None, sep=' ', names=['label', 'x1', 'x2'])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.axes._subplots.AxesSubplot at 0x1156562b0>"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\nB2hCSOFK9kPTAAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x1154b6278>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "ax = plt.axes()\n",
    "\n",
    "dfb.query('label ==  1').plot.scatter(x='x1', y='x2', ax=ax, color='blue')\n",
    "dfb.query('label == -1').plot.scatter(x='x1', y='x2', ax=ax, color='red')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Finished 10000 iterations; logloss: 15.98874822112764\n",
      "Finished 20000 iterations; logloss: 15.98874821838721\n",
      "Finished 30000 iterations; logloss: 15.988748218387205\n",
      "Converged in 30395 iterations\n"
     ]
    }
   ],
   "source": [
    "Xa, Ya = load_data('data_a.txt')\n",
    "tha, erra = logistic_regression(Xa, Ya)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n/wFM5Gk1l9i5uwAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x115fe2e80>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "fig, axes = plt.subplots(1, 3, sharex=True, sharey=True, figsize=(12, 3))\n",
    "axes = axes.ravel()\n",
    "\n",
    "for k, theta in enumerate(thetas[:3]):\n",
    "    ax = axes[k]\n",
    "    xs = np.arange(0, 1, 0.1)\n",
    "    ys = (-theta[0] - theta[1] * xs) / theta[2]\n",
    "    ax.plot(xs, ys, lw=0.5)\n",
    "    dfa.query('label ==  1').plot.scatter(x='x1', y='x2', ax=ax, color='blue')\n",
    "    dfa.query('label == -1').plot.scatter(x='x1', y='x2', ax=ax, color='red')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "Xb, Yb = load_data('data_b.txt')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Finished 10000 iterations; logloss: 3.045092224758587\n",
      "Finished 20000 iterations; logloss: 2.32556706272674\n",
      "Finished 30000 iterations; logloss: 1.9655254432929143\n",
      "Finished 40000 iterations; logloss: 1.7379713038351392\n",
      "Finished 50000 iterations; logloss: 1.5770732018729934\n"
     ]
    }
   ],
   "source": [
    "thetas, errors = logistic_regression(Xb, Yb)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\nupQ61R/4OF4AAAAASUVORK5CYII=\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x1171db710>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "fig, axes = plt.subplots(2, 3, sharex=True, sharey=True, figsize=(12, 6))\n",
    "axes = axes.ravel()\n",
    "\n",
    "for k, theta in enumerate(thetas[:9]):\n",
    "    ax = axes[k]\n",
    "    xs = np.arange(0, 1, 0.1)\n",
    "    ys = (-theta[0] - theta[1] * xs) / theta[2]\n",
    "    ax.plot(xs, ys, lw=0.5)\n",
    "    dfb.query('label ==  1').plot.scatter(x='x1', y='x2', ax=ax, color='blue')\n",
    "    dfb.query('label == -1').plot.scatter(x='x1', y='x2', ax=ax, color='red')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The reason why it takes so long for LR to converge is because of their perfect linearly separability (even at the early stage), after which the algorithm is just trying to increase the scale of theta so as to increase $|\\theta^Tx|$, which would lead to higher probability, hence higher likelihood.\n",
    "\n",
    "In the case of perfect separation, the theorectical maximum likelihood is 1, so untill theta reaches infinity, won't the algorithm stop.\n",
    "\n",
    "This doesn't happen to A because it's not linearly separable."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# (c)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "i. Using a different constant learning rate.\n",
    "\n",
    "**Ans:** No, as the $\\theta$ still needs to go to infinite to make maximum likelihood. However, it's may reach the numeric infinite (e.g. 1e15) faster if the learning rate is huge.\n",
    "\n",
    "ii. Decreasing the learning rate over time (e.g. scaling the initial learning rate by $1/t^2$, where $t$ is the number of gradient descent iterations thus far).\n",
    "\n",
    "**Ans:** No, this is not a problem caused by learning rate being too big.\n",
    "\n",
    "iii. Adding a regularization term $\\left|\\left|\\theta\\right|\\right|^2_2$ to the loss function.\n",
    "\n",
    "**Ans:** Yes, thus $\\theta$ won't be scaled to infinitely large.\n",
    "\n",
    "iv. Linear scaling of the input features.\n",
    "\n",
    "**Ans:** No, scaling input features is irrelevant to $\\theta$ getting infinitely large.\n",
    "\n",
    "v. Adding zero-mean Gaussian noise to the training data or labels\n",
    "\n",
    "**Ans:** Yes, Adding Gaussian noise may make the training data imperfectly separable with a linear classifier. See [Issue 12](https://github.com/zyxue/stanford-cs229/issues/12) for a brief discussion."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# (d)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Dataset B won't cause a problem for SVM because in SVM, it tries to maximize the geometric margin, which won't be affected by scaling $\\left|\\left|\\theta\\right|\\right|$."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": true
   },
   "source": [
    "**More details** in response to [Issue 3](https://github.com/zyxue/stanford-cs229/issues/3)."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Comparing logistic regression with SVM (with a linear kernel), both look for a hyperplane, but with different goals in mind:\n",
    "\n",
    "* LR searches for a hyperplane that maximizes the likelihood, while\n",
    "* SVM looks for a hyperplane that maximizes the margin."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "In standard logistic regression, the goal is the maximize\n",
    "\n",
    "\\begin{align*}\n",
    "\\max_{\\theta}L(\\theta) \n",
    "&= \\max_{\\theta} \\prod_{i=1}^{m} (h_{\\theta}(x^{(i)}))^{y{(i)}} (1 - h_{\\theta}(x^{(i)}))^{1 - y{(i)}} \\\\\n",
    "&= \\max_{\\theta} \\prod_{i=1}^{m} (\\frac{1}{1 + e^{-\\theta^T x}})^{y{(i)}} (1 - \\frac{1}{1 + e^{-\\theta^T x}})^{1 - y{(i)}} \\\\\n",
    "\\end{align*}\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "where $h_{\\theta}$ is the sigmoid function, and $y \\in \\{0, 1\\}$."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "In the Ng's [SVM note](http://cs229.stanford.edu/notes/cs229-notes3.pdf), it introduces two concepts about margin, and data are labeled differently, $y \\in \\{-1, 1\\}$. Also, it replaces $\\left|\\left|\\theta \\right|\\right|$ with $w$ and $b$."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**Functional margin**, which is affected by scaling $w$ and $b$.\n",
    "\n",
    "\\begin{align*}\n",
    "\\hat \\gamma &= \\min_{i = 1,\\cdots,m} \\hat \\gamma^{(i)} \\\\\n",
    "&= \\min_{i = 1,\\cdots,m} y^{(i)}(w^Tx^{(i)} + b)\n",
    "\\end{align*}"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**Geometric margin**, which won't be affected by scaling $w$ and $b$\n",
    "\n",
    "\\begin{align*}\n",
    "\\gamma &= \\min_{i = 1,\\cdots,m} \\gamma^{(i)} \\\\\n",
    "&= \\min_{i = 1,\\cdots,m} y^{(i)}\\bigg(\\big(\\frac{w}{\\left|\\left|w\\right|\\right|})^T x^{(i)} + \\frac{b}{\\left|\\left|w\\right|\\right|} \\bigg)\n",
    "\\end{align*}"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "So in SVM, the final goal is to maximize geometric margin,\n",
    "\n",
    "\\begin{align*}\n",
    "\\max_{w, b} &\\; \\gamma \\\\\n",
    "\\textrm{s.t.} &\\; y^{(i)}(w^T x^{(i)} + b) \\ge \\gamma, i=1,\\cdots,m \\\\\n",
    "&\\; \\left|\\left|w\\right|\\right| = 1\n",
    "\\end{align*}"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "instead of functional margin. As seen, the two are related by $\\left|\\left|w\\right|\\right|$. Hence, the above can be   equivalently written as"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "\\begin{align*}\n",
    "\\max_{w, b} &\\; \\frac{\\hat \\gamma}{\\left|\\left| w \\right|\\right|} \\\\\n",
    "\\textrm{s.t.} &\\; y^{(i)}(w^T x^{(i)} + b) \\ge \\hat \\gamma, i=1,\\cdots,m \\\\\n",
    "&\\; \\hat \\gamma = 1\n",
    "\\end{align*}"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Replacing $\\hat \\gamma$ with $1$,\n",
    "\n",
    "\\begin{align*}\n",
    "\\max_{w, b} &\\; \\frac{1}{\\left|\\left| w \\right|\\right|} \\\\\n",
    "\\textrm{s.t.} &\\; y^{(i)}(w^T x^{(i)} + b) \\ge \\hat \\gamma, i=1,\\cdots,m \\\\\n",
    "\\end{align*}"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Maximizing $\\frac{1}{\\left|\\left| w \\right|\\right|}$ is equivalent to minimizing $\\frac{1}{2}\\left|\\left| w \\right|\\right|^2$. The $\\frac{1}{2}$ and taking square are probably just for mathmatical convenience when taking derivatives during optimization. Hence, we end up with the exact optimization problem as shown in the notes,"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Replacing $\\hat \\gamma$ with $1$,\n",
    "\n",
    "\\begin{align*}\n",
    "\\min_{w, b} &\\; \\frac{1}{2} \\left|\\left| w \\right|\\right|^2 \\\\\n",
    "\\textrm{s.t.} &\\; y^{(i)}(w^T x^{(i)} + b) \\ge \\hat \\gamma, i=1,\\cdots,m \\\\\n",
    "\\end{align*}"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Inspecting the derivation, it started with \n",
    "\n",
    "**maximizing $\\gamma$ while fixing $\\left|\\left|w\\right|\\right|$**,\n",
    "\n",
    "which are then transformed into \n",
    "\n",
    "**minimizing $\\left|\\left|w\\right|\\right|$ while fixing $\\hat \\gamma$**.\n",
    "\n",
    "It is like the two sides of the same coin. (Note $\\gamma$ is equal to $\\hat \\gamma$ when $\\left|\\left|w\\right|\\right| = 1$)"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.5.1"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 0
}
